﻿using AexoManager.BussinesLogic;
using AexoManager.Datos;
using AexoManager.Models;
using log4net;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace AexoManager.Controllers
{
    public class DespieceController : Controller
    {

        private static readonly ILog log = LogManager.GetLogger(typeof(DespieceController));
        //
        // GET: /Despiece/


        /// <summary>
        /// Lanza la grilla de productos.
        /// </summary>
        /// <returns></returns>
        public ActionResult Index()
        {
            var productos = new BSProducto().ObtenerProductos();
            ViewBag.Productos = productos;
            return View();
        }

        /// <summary>
        /// Lanza la visualizacion del despiece de un producto. 
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public ActionResult Arbol(DespieceViewModel model)
        {
            try
            {
                var producto = new BSProducto().Get(new Producto { IdProducto = model.IdProducto });
                var arbolDespiece = new BSDespiece().ObtenerDespiece(new Producto { IdProducto = model.IdProducto });

                ViewBag.DescripcionProducto = producto.Descripcion;
                ViewBag.ArbolDespiece = arbolDespiece;


            }
            catch (Exception ex)
            {
                log.Error("Ocurrio un error en la presentacion del Arbol", ex);
                ModelState.AddModelError("ErrorMensaje", "Ocurrio un error al mostrar el arbol de despiece.");
            }
            return View("DespieceTree");
        }

        /*
        public ActionResult ArmarArbolDespiece()
        {
            try
            {
                var arbolDespiece = new BSDespiece().ObtenerDespice(new Producto { IdProducto = 3 }, new Parte { IdParte = 1430 });
                IList<Despiece> arbol = new List<Despiece>();
                arbol.Add(arbolDespiece);
                var json = Json(arbol, JsonRequestBehavior.AllowGet);
                return json;
            }
            catch (Exception ex)
            {
                throw;
            }
        }
         * */

        /// <summary>
        /// Lanza la visualizacion de los hijos de una parte. 
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public ActionResult Parte(DespieceViewModel model)
        {
            try
            {
                if (model.IdPartePadre == 0)
                    model = (DespieceViewModel)TempData["model"];

                var partePadre = new BSParte().Get(new Parte { IdParte = model.IdPartePadre });
                var hijos = new BSDespiece().ObtenerHijos(new Producto { IdProducto = model.IdProducto }, new Parte { IdParte = model.IdPartePadre });
                var arbolDeParte = new BSDespiece().ObtenerDespiece(new Producto { IdProducto = model.IdProducto }, new Parte { IdParte = model.IdPartePadre });

                ViewBag.Resultado = hijos;
                ViewBag.Padre = partePadre;
                ViewBag.ArbolDeParte = arbolDeParte;

            }
            catch (Exception ex)
            {

                log.Error("Ocurrio un error consultando los hijos de esta parte", ex);
                ModelState.AddModelError("ErrorMensaje", "Ocurrio un error al mostrar los hijos de la Parte.");
            }
            return View("DespieceParte", model);
        }


        /// <summary>
        /// Agrega un hijo nuevo a la parte elegida
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public ActionResult AgregarHijo(DespieceViewModel model)
        {
            try
            {
                BSDespiece bsDespiece = new BSDespiece();
                var listaDespieceParte = new BSInsumo().ObtenerInsumos(new Parte { IdParte = model.IdParte }).OrderBy(x => x.Nivel);
                if (listaDespieceParte != null)
                {
                    foreach (var item in listaDespieceParte)
                    {
                        var nuevoDespiece = new Despiece
                        {
                            Cantidad = item.Cantidad,
                            Parte = new Parte { IdParte = item.IdParte },
                            Producto = new Producto { IdProducto = model.IdProducto }
                        };

                        bsDespiece.SaveHijo(nuevoDespiece, (item.IdPartePadre != null) ? (int) item.IdPartePadre : model.IdPartePadre);
                    }
                }
                else
                {
                    var nuevoDespiece = new Despiece
                    {
                        Cantidad = model.Cantidad,
                        Parte = new Parte { IdParte = model.IdParte },
                        Producto = new Producto { IdProducto = model.IdProducto }
                    };

                    bsDespiece.SaveHijo(nuevoDespiece, model.IdPartePadre);
                }



                model.IdParte = model.IdPartePadre;
                TempData["model"] = model;
            }
            catch (Exception ex)
            {

                log.Error("Ocurrio un error en el guardado", ex);
                ModelState.AddModelError("ErrorMensaje", "Ocurrio un error al mostrar el arbol de despiece.");
            }
            return RedirectToAction("Parte");

            //return View("DespieceParte", model);
        }

        public ActionResult ConvertirInsumo(DespieceViewModel model)
        {
            try
            {
                var producto = new BSProducto().Get(new Producto { IdProducto = model.IdProducto });
                var arbolDespiece = new BSDespiece().ObtenerDespiece(new Producto { IdProducto = model.IdProducto });

                ViewBag.DescripcionProducto = producto.Descripcion;
                ViewBag.ArbolDespiece = arbolDespiece;
            }
            catch (Exception)
            {

                throw;
            }
            return View();
        }

        public ActionResult ListarProducto()
        {
            try
            {

            }
            catch (Exception ex)
            {

                log.Error("Ocurrio un error en la presentacion ListarProducto", ex);
                ModelState.AddModelError("ErrorMensaje", "Ocurrio un error al mostrar la lista de productos.");
            }

            return View("Producto");
        }

        public ActionResult GuardarDespieceParte(DespieceViewModel model)
        {
            try
            {
                if (model.IdPartePadre == 0)
                    model = (DespieceViewModel)TempData["model"];

                new BSDespiece().SaveNuevoInsumo(new Producto { IdProducto = model.IdProducto }, new Parte { IdParte = model.IdPartePadre });


                TempData["model"] = model;

            }
            catch (Exception ex)
            {
                log.Error("Ocurrio un error en el guardado del Insumo", ex);
                ModelState.AddModelError("ErrorMensaje", "Ocurrio un error al guardar el nuevo insumo");
            }
            return RedirectToAction("Parte");

        }

        public ActionResult AjaxBuscaParteInsumo(int IdPartePadre)
        {
            try
            {
                var isExisting = new BSInsumo().ExisteParteInsumo(new Insumo { IdParte = IdPartePadre });
                return Json(new { IsExisting = isExisting }, JsonRequestBehavior.AllowGet);
            }
            catch (Exception)
            {
                throw;
            }
        }


        /// <summary>
        /// Metodo para el autocomplete de Partes en la pantalla de agregar hijos.
        /// </summary>
        /// <param name="query"></param>
        /// <returns></returns>
        public ActionResult JsonConsultarParte(string query)
        {
            var partes = new BSParte().ObtenerPartes(new Parte { Descripcion = query }, 0, 20);
            List<Parte> lista = new List<Parte>();
            foreach (var item in partes)
            {
                lista.Add(new Parte { IdParte = item.IdParte, Descripcion = item.Descripcion });
            }
            return Json(lista, JsonRequestBehavior.AllowGet);
        }

        /// <summary>
        /// Guarda un producto se usa para el Agregar y el modificar
        /// </summary>
        /// <param name="modelo"></param>
        /// <returns></returns>
        public ActionResult GuardarProducto(DespieceViewModel modelo)
        {
            try
            {
                BSProducto bsProducto = new BSProducto();

                if (modelo.IdProducto != 0)
                {
                    var unProducto = bsProducto.Get(new Producto { IdProducto = modelo.IdProducto });
                    unProducto.Codigo = modelo.Codigo;
                    unProducto.Descripcion = modelo.Descripcion;
                    unProducto.Parte = new Parte { IdParte = modelo.IdParte };

                    bsProducto.Update(unProducto);
                }
                else
                {
                    Producto unProducto = new Producto();
                    unProducto.Codigo = modelo.Codigo;
                    unProducto.Descripcion = modelo.Descripcion;
                    unProducto.Parte = new Parte { IdParte = modelo.IdParte };

                    bsProducto.Save(unProducto);

                    new BSDespiece().SaveRoot(new Despiece
                    {
                        Producto = new Producto { IdProducto = unProducto.IdProducto },
                        Cantidad = 1,
                        Parte = new Parte { IdParte = modelo.IdParte }
                    });
                }

                BSProducto.Confirmar();
            }
            catch (Exception ex)
            {
                log.Error("Ocurrio un error en la presentacion de Guardar", ex);
                ModelState.AddModelError("ErrorMensaje", "Ocurrio un error al registrar esta accion.");
            }

            return RedirectToAction("Index");
        }

        /// <summary>
        /// Lanza la pantalla para la carga de un nuevo producto.
        /// </summary>
        /// <returns></returns>
        public ActionResult NuevoProducto()
        {
            DespieceViewModel model = new DespieceViewModel();
            try
            {

                //model.PartesFinales = new BSParte().ObtenerPartesFinales();
                ViewBag.PartesFinales = new BSParte().ObtenerPartesFinales();

            }
            catch (Exception ex)
            {

                log.Error("Ocurrio un error en la presentacion NuevoProducto", ex);
                ModelState.AddModelError("ErrorMensaje", "Ocurrio un error al Ingresar un nuevo producto.");
            }

            return View("ProductoDetalle", model);
        }

        /// <summary>
        /// Lanza la pantalla para la carga de la modificacion de un producto.
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public ActionResult ModificarProducto(DespieceViewModel model)
        {
            try
            {
                var unProducto = new BSProducto().Get(new Producto { IdProducto = model.IdProducto });
                model.IdProducto = unProducto.IdProducto;
                model.Descripcion = unProducto.Descripcion;
                model.Codigo = unProducto.Codigo;
                model.IdParte = (int)unProducto.IdParteFinal;
                //model.PartesFinales = new BSParte().ObtenerPartesFinales();
                ViewBag.PartesFinales = new BSParte().ObtenerPartesFinales();

            }
            catch (Exception ex)
            {

                log.Error("Ocurrio un error en la presentacion NuevoProducto", ex);
                ModelState.AddModelError("ErrorMensaje", "Ocurrio un error al Ingresar un nuevo producto.");
            }

            return View("ProductoDetalle", model);
        }
    }
}
